/*
    单例模式

    首先理解单例模式

    单：指的是一个
    例：指的是创建的实例

    单例：保证一个类只有一个实例。也就是使用类创建的实例始终是相同的。


    单例模式分为懒汉式和饿汉式
*/

// class Single {}

// let s1 = new Single();
// let s2 = new Single();

// console.log(s1 === s2);

/*

    简单实现原理
    
    用一个变量来标志当前是否已经为某个类创建过实例

    实现的方法一般是先判断实例存在与否，如果存在直接返回，如果不存在就创建了再返回，这就确保了一个类只有一个实例对象

    懒汉式

 */

// class Single {
//   static instance = null;

//   constructor() {
//     if (!Single.instance) {
//       Single.instance = this;
//     }
//     return Single.instance;
//   }
// }

// let s1 = new Single();
// let s2 = new Single();

// console.log(s1 === s2);

// class Single {
//   private static instance = null;

//   private constructor() {}

//   public static getInstance() {
//     if (!Single.instance) {
//       Single.instance = new Single();
//     }
//     return Single.instance;
//   }
// }

// let s1 = Single.getInstance();
// let s2 = Single.getInstance();

// console.log(s1 === s2);

/* 
    饿汉式

    类加载的时候就实例化，并且创建单例对象。
*/

// class HungrySingle {
//   static instance = new HungrySingle();

//   constructor() {
//     return HungrySingle.instance;
//   }
// }

// let s1 = new HungrySingle();
// let s2 = new HungrySingle();

// console.log(s1 === s2);

// class HungrySingle {
//   static instance = new HungrySingle();

//   private constructor() {}

//   public static getInstance() {
//     return HungrySingle.instance;
//   }
// }

// let s1 = HungrySingle.getInstance();
// let s2 = HungrySingle.getInstance();

// console.log(s1 === s2);
